package top.lixunda.commerce.common.core.controller.wrapper;

import java.util.List;
import java.util.Map;

/**
 * @author LiXunda
 * @version time:2019/10/14 10:27
 */
@SuppressWarnings({"unused", "AlibabaAbstractMethodOrInterfaceMethodMustUseJavadoc"})
public interface IQuerySqlWrapper<T> extends IAbstractSqlWrapper<T> {

    /**
     * 查询所有
     *
     * @return 函数式，返回恩深
     */
    default IQuerySqlWrapper selectAll() {
        getEntityBlock().selectAll();
        return this;
    }

    /**
     * 查询某些字段
     *
     * @param columns 字段名
     * @return 函数式，返回恩深
     */
    default IQuerySqlWrapper select(String... columns) {
        getEntityBlock().select(columns);
        return this;
    }

    /**
     * 分组
     *
     * @param column 字段名
     * @return 函数式，返回恩深
     */
    @Override
    IQuerySqlWrapper<T> groupBy(String... column);

    /**
     * 排序
     *
     * @param map 排序字段和方式
     * @return 函数式，返回恩深
     */
    @Override
    IQuerySqlWrapper<T> orderBy(Map<String, String> map);

    /**
     * 单个排序
     *
     * @param column 排序字段
     * @param value  排序方式
     * @return 函数式，返回恩深
     */
    @Override
    IQuerySqlWrapper<T> orderBy(String column, String value);

    /**
     * 升序排序
     *
     * @param columns 排序字段
     * @return 函数式，返回恩深
     */
    @Override
    IQuerySqlWrapper<T> orderByAsc(String... columns);

    /**
     * 降序排序
     *
     * @param columns 排序字段
     * @return 函数式，返回恩深
     */
    @Override
    IQuerySqlWrapper<T> orderByDesc(String... columns);

    /**
     * having条件
     *
     * @param column 字段
     * @return 函数式，返回恩深
     */
    @Override
    IQuerySqlWrapper<T> having(String column);

    /**
     * limit
     *
     * @param start 开始序号
     * @param count 数量
     * @return 函数式，返回恩深
     */
    @Override
    IQuerySqlWrapper<T> limit(int start, int count);

    @Override
    IQuerySqlWrapper<T> allEq(Map<String, Object> map);

    @Override
    IQuerySqlWrapper<T> eq(String column, Object value);

    @Override
    IQuerySqlWrapper<T> ne(String column, Object value);

    @Override
    IQuerySqlWrapper<T> gt(String column, Object value);

    @Override
    IQuerySqlWrapper<T> ge(String column, Object value);

    @Override
    IQuerySqlWrapper<T> lt(String column, Object value);

    @Override
    IQuerySqlWrapper<T> le(String column, Object value);

    @Override
    IQuerySqlWrapper<T> between(String column, Object value1, Object value2);

    @Override
    IQuerySqlWrapper<T> notBetween(String column, Object value1, Object value2);

    @Override
    IQuerySqlWrapper<T> like(String column, String value);

    @Override
    IQuerySqlWrapper<T> notLike(String column, String value);

    @Override
    IQuerySqlWrapper<T> likeLeft(String column, String value);

    @Override
    IQuerySqlWrapper<T> likeRight(String column, String value);

    @Override
    IQuerySqlWrapper<T> isNull(String... column);

    @Override
    IQuerySqlWrapper<T> isNotNull(String... column);

    @Override
    IQuerySqlWrapper<T> in(String column, List<?> values);

    @Override
    IQuerySqlWrapper<T> notIn(String column, List<?> values);

    @Override
    IQuerySqlWrapper<T> or();

    @Override
    IQuerySqlWrapper<T> and();

    @Override
    IQuerySqlWrapper<T> or(ConditionBlock sqlBlock);

    @Override
    IQuerySqlWrapper<T> and(ConditionBlock sqlBlock);

    IQuerySqlWrapper<T> setEntityBlock(QueryEntityBlock<T> entityBlock);

    @Override
    QueryEntityBlock<T> getEntityBlock();

    @Override
    T getEntity();

    @Override
    IQuerySqlWrapper<T> setEntity(T t);

    BaseDataQuerySqlWrapper<T> toDataQuerySqlWrapper();
}
